package com.hw.blog.common;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * 날짜 유틸리티 클래스
 * @version 1.0
 * @since   2011.04.25
 * @author  jckang
 */
public final class DateUtil {
    /** 현재 년도를 돌려준다     */
	public static int getYear() {
		return Calendar.getInstance().get( Calendar.YEAR );
	}
	 

    /** 현재 월을 돌려준다    */
	public static int getMonth(){
		return Calendar.getInstance().get( Calendar.MONTH ) + 1;
	}
	
	public static String getStrMonth(){
		int i_month = getMonth();
		String month = "";
		if(i_month < 10){
			month = "0"+i_month;
		}else{
			month = ""+i_month;
		}
		return month;
	}

    /** 현재 일을 돌려준다    */
	public static int getDate() {
		return Calendar.getInstance().get(Calendar.DATE );
	}
	
	public static String getStrDate(){
		int i_date = getDate();
		String date = "";
		if(i_date < 10){
			date = "0"+i_date;
		}else{
			date = ""+i_date;
		}
		return date;
	}

    /** 현재 시각을 돌려준다    */
	public static int getHour() {
		return Calendar.getInstance().get( Calendar.HOUR_OF_DAY );
	}
	
	public static String getHour2() {
		int iHour = getHour();
		System.out.println(":iHour:::::::::::::"+iHour);
		String hour = "";
		if(iHour < 10){
			hour = "0"+iHour;
		}else{
			hour = iHour+"";
		}
		return hour;
	}

    /** 현재 분를 돌려준다    */
	public static int getMinute() {
		return Calendar.getInstance().get( Calendar.MINUTE );
	}

    /** 현재 초를 돌려준다    */
	public static int getSecond() {
		return Calendar.getInstance().get( Calendar.SECOND );
	}

	/** 시스템 시간에 대한 년도를 돌려준다    */
	public static int getYear( long time ) {
		return getValue( time ,Calendar.YEAR );
	}

	/** 시스템 시간에 대한 월을 돌려준다    */
	public static int getMonth( long time ) {		
		return getValue( time ,Calendar.MONTH ) + 1;
	}

	/** 시스템 시간에 대한 일을 돌려준다    */
	public static int getDate( long time ) {
		return getValue( time ,Calendar.DATE );
	}

	/** 시스템 시간에 대한 시각를 돌려준다    */
	public static int getHour( long time ) {
		return getValue( time ,Calendar.HOUR_OF_DAY );
	}

	/** 시스템 시간에 대한 분을 돌려준다    */
	public static int getMinute( long time ) {
		return getValue( time ,Calendar.MINUTE );
	}
	
	/** 시스템 시간에 대한 초를 돌려준다    */
	public static int getSecond( long time ) {
		return getValue( time ,Calendar.SECOND );
	}

    /** 필드에 따른 값을 돌려준다
     *  @param time 시스템 시간
     *  @param filed 시간의 필드값
     *  @return 필드에 대한 값     */
	public static int getValue( long time ,int filed ) {
		Calendar car = Calendar.getInstance();
		car.setTimeInMillis( time );

		return car.get(filed);
	}

	/** 오늘 날짜를 돌려준다    */
	public static String getCurDate() {
		return getFormat( System.currentTimeMillis() ,"YYYY/MM/DD" );
	}

	/** 원하는 형식에 맞는 오늘 날짜를 돌려준다    */
	public static String getCurDate( String format ) {
		return getFormat( System.currentTimeMillis() ,format );
	}

	/** 현재 월과 원하는값과 더한 결과를 돌려준다    */
	public static String addMonth( int value ) {
		return add( System.currentTimeMillis() ,value ,Calendar.MONTH ,"YYYY/MM/DD" );
	}

	/** 현재 월과 원하는값과 더한 결과를  형식에 맞게 돌려준다    */
	public static String addMonth( int value ,String format ) {
		return add( System.currentTimeMillis() ,value ,Calendar.MONTH ,format );
	}
	
	/** 월과 원하는값과 더한 결과를  형식에 맞게 돌려준다    */
	public static String addMonth( String date, int value ,String format ) {

		int strs[] = getDateDivide(date);

		Calendar car = Calendar.getInstance();
		car.set( strs[0] , strs[1], strs[2] );

		return add( car.getTimeInMillis() ,value ,Calendar.MONTH ,format );
	}
	
	/** 현재 일과 원하는값과 더한 결과를 돌려준다    */
	public static String addDate( int value ) {
		return add( System.currentTimeMillis() ,value ,Calendar.DATE ,"YYYY/MM/DD" );
	}

	/** 현재 일과 원하는값과 더한 결과를 돌려준다    */
	public static String subtractDate( int value ) {
		return add( System.currentTimeMillis() ,value ,Calendar.DATE ,"MM/DD" );
	}
	
	/** 현재 일과 원하는값과 더한 결과를  형식에 맞게 돌려준다    */
	public static String addDate( int value ,String format ) {
		return add( System.currentTimeMillis() ,value ,Calendar.DATE ,format );
	}
	
	/** 일과 원하는값과 더한 결과를  형식에 맞게 돌려준다    */
	public static String addDate( String date, int value ,String format ) {

		int strs[] = getDateDivide(date);

		Calendar car = Calendar.getInstance();
		car.set( strs[0] , strs[1], strs[2] );

		return add( car.getTimeInMillis() ,value ,Calendar.DATE ,format );
	}
	
	/** 시간을 더하여 돌려준다
     *  @param time 시스템 시간
     *  @param value 더할 값
     *  @param filed 계산을 원하는 필드 ( 년,월,일... )
     *  @param format 형식
    *  @return 계산된 값을 원하는 형식으로 돌려준다.     */
	public static String add( long time, int value ,int filed ,String format ) {

		Calendar car = Calendar.getInstance();
		car.setTimeInMillis(time);
		car.add( filed, value );

		return getFormat( car.getTimeInMillis() ,format );
	}

	/**	 넘어온 날짜를 년,월,일로 나눈다
	 * @param value 분리할 날짜값
	 * @return 년,월,일을 int형 배열에 담아 돌려준다.
	 */
	public static int[] getDateDivide( String value ) {
		int date[] = new int[3];
		value = IntegerUtil.through(value);

		if( value.length() >= 4 ) {
			date[0] = Integer.parseInt( value.substring( 0 ,4 ) );
		}
		if( value.length() >= 6 ) {
			date[1] = Integer.parseInt( value.substring( 4 ,6 ) ) -1 ;
		}
		if( value.length() >= 7 ) {
			date[2] = Integer.parseInt( value.substring( 6 ) );
		}

		return date;
	}

	/**	날자에 해당하는 월의 가장 마지막 일자을 돌려준다
	 * @param value 날짜값
	 * @return 마지막 일날
	 */
	public static int getMonthLastDay( String value ) {
		int date[] = getDateDivide( value );

		Calendar car = Calendar.getInstance();
		car.set( date[0] ,date[1] ,date[2] );

		return car.getActualMaximum( car.DATE );
	}

	/**	날자에 해당하는 월의 가장 마지막 날짜을 돌려준다
	 * @param value 날짜값
	 * @return 마지막 날짜
	 */
	public static String getMonthLastDate( String value ) {
		return getMonthLastDate( value ,"YYYY/MM/DD" );
	}

	/**	날자에 해당하는 월의 가장 마지막 날짜을 돌려준다
	 * @param value 날짜값
	 * @return 마지막 날짜
	 */
	public static String getMonthLastDate( String value ,String format ) {
		int divs[] = getDateDivide(value);

		Calendar car = Calendar.getInstance();
		car.set( divs[0] ,divs[1] ,divs[2] );

		car.set( divs[0] ,divs[1] ,car.getActualMaximum(car.DATE) );
		return getFormat( car.getTimeInMillis() ,format );
	}

	/**	 형식에 맞는 날짜형식으로 돌려준다
	 * @param time 시스템 시간값
	 * @param format 형식
	 * @return 형식에 맞는 날짜형태로 돌려준다.
	 */
	public static String getFormat( long time, String format ) {
		if( format == null || format.length() == 0 ) {
			format = "YYYY/MM/DD hh:mm:ss";
		}

		StringBuffer temp = new StringBuffer();
		StringBuffer result = new StringBuffer();

		char chs[] = format.toCharArray();
		temp.append(chs[0]);

		for( int i=1; i < chs.length ; i++ ) {
			if( temp.indexOf( String.valueOf(chs[i]) ) != -1 ) {
				temp.append( chs[i] );
			}
			else {
				result.append( get( time, temp.toString() ) );

				temp.delete( 0, temp.length() );
				temp.append( chs[i] );
			}
		}

		result.append( get( time, temp.toString() ) );
		return result.toString();
	}
	
	/**	 형식에 맞는 날짜형식으로 돌려준다
	 * @param time 시스템 시간값	 
	 * @param format 원하는 형식
	 * @return 형식에 맞는 날짜형태로 문자형태로 돌려준다.
	 */
	public static String get( long time, String format ) {
		if( format.equals("YYYY") ) {
			return String.valueOf( getYear(time) );
		}
		else if( format.equals("YY") ) {
			return String.valueOf( getYear(time) ).substring(2);
		}
		else if( format.indexOf("M") != -1 ) {
			return StringUtil.addChar( getMonth(time) ,format.length() ,"0" );
		}
		else if( format.indexOf("D") != -1 ) {
			return StringUtil.addChar( getDate(time) ,format.length() ,"0" );
		}
		else if( format.indexOf("o") != -1 ) {
			return StringUtil.addChar( getHour(time) ,format.length() ,"0" );
		}
		else if( format.indexOf("m") != -1 ) {
			return  StringUtil.addChar( getMinute(time) ,format.length() ,"0" );
		}
		else if( format.indexOf("s") != -1 ) {
			return StringUtil.addChar( getSecond(time) ,format.length() ,"0" );
		}

		return format;
	} 
	/**
	 * 타입별 날짜 변환 
	 * @param String paramDate , String dateFormat
	 * @return String returnDate
	 */
	public static String getDateFormat(String paramDate, String paramType ){ 
		String retDate = "";
		
		try{ 
			if(!StringUtil.isNull(paramDate)){
				DateFormat formatter = new SimpleDateFormat(paramType);   
				Calendar c = Calendar.getInstance(); 
				c.set(Integer.parseInt(paramDate.substring(0,4)), (Integer.parseInt(paramDate.substring(4,6))-1),Integer.parseInt(paramDate.substring(6,8)));
				retDate = formatter.format(c.getTime());
			}  
		}catch (Exception e){
			e.printStackTrace();
		}
		return retDate;
		
	} 
}